package com.example.common.app;

import android.os.SystemClock;
import android.widget.Toast;

import androidx.annotation.StringRes;

import net.qiujuer.genius.kit.handler.Run;
import net.qiujuer.genius.kit.handler.runable.Action;

import java.io.File;


/**
 * @author:0.2℃
 * @date： 2021-12-25 16:26
 * @version:
 * @Description ：
 */
public class Application extends android.app.Application {
    private static Application instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    /**
     * 外部获取单例
     * @return
     */
    public static Application getInstance() {
        return instance;
    }

    /**
     * 获取缓存文件夹地址
     * @return 当前APP的缓存地址
     */
    public static File getCacheDirFile() {
        return instance.getCacheDir();
    }

    /**
     * 获取头像的临时储存文件地址
     * @return
     */
    public static File getPortraitTmpFile() {
        // 得到头像目录的缓存地址
        File dir = new File(getCacheDirFile(), "portrait");
        // 创建所有的对应的文件夹
        dir.mkdirs();

        // 可能会有很多的缓存路径，因为每一次返回的路径都是不一样的
        // 需要删除原本缓存目录中其他的缓存文件夹
        File[] files = dir.listFiles();
        if (files != null && files.length > 0) {
            for (File file : files) {
                file.delete();
            }
        }

        // 返回一个当前时间戳的目录文件地址
        /**
         * 返回所有的缓存的文件
         * 每次返回地址是不一样的，后面Glide框架上传涉及到地址有一个缓存问题
         * 所以我们这里使用的地址要是随机可变的并且保证地址被清理掉
         */
        File path = new File(dir, SystemClock.uptimeMillis() + ".jpg");
        return path.getAbsoluteFile();
    }

    /**
     * 获取声音文件的本地地址
     * @param isTmp 是否为缓存文件，true 每次返回的文件地址都是一样的
     * @return 录音文件的地址
     */
    public static File getAudioTmpFile (boolean isTmp) {
        File dir = new File(getCacheDirFile(), "audio");
        dir.mkdirs();

        File[] files = dir.listFiles();
        if (files != null && files.length > 0) {
            for (File file : files) {
                file.delete();
            }
        }

        /**
         * 当传入的isTmp为true，每次都是返回末尾是tmp.mp3的文件
         * 如果是false，就会随机创建一个前缀为SystemClock.uptimeMillis()的文件
         * 这样做的意义在于：
         *      如果是进行录音的话，每次录音的时候都是用同一个文件，都是tmp.mp3这个文件
         *      在确定我已经录音好了，就转换为有前缀时间戳的文件，再把这个文件上传
         *      这样子做可以避免用户在录音的时候频繁取消的时候产生大量的垃圾文件
         *      如果说以前使用的就是有前缀时间戳的文件，频繁取消录音，进行文件的返回的话，就会出现一系列的垃圾文件存在
         */
        File path = new File(getCacheDirFile(), isTmp ? "tmp.mp3" : SystemClock.uptimeMillis() + ".mp3");

        // getAbsolutePath : 这是返回此抽象路径的绝对路径名字符串
        // getAbsoluteFile : 这是返回此抽象路径的绝对路径形式
        return path.getAbsoluteFile();
    }

    /**
     * 显示一个吐司的方法
     * @param msg
     */
    public static void showToast(final String msg) {
        // Toast只能在主线程中显示，所有的都需要进行线程切换
        // 保证一定是在主线程中进行show操作
        Run.onUiAsync(new Action() {
            @Override
            public void call() {
                Toast.makeText(instance, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    /**
     * 显示一个吐司
     * @param msgId 传递的是字符串的资源
     */
    public static void showToast(@StringRes int msgId) {
        showToast(instance.getString(msgId));
    }
}
